//
// Description: 282. 石子合并
// Created by Loading on 2022/6/3.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 310;

int s[N];
// dp[i][j] 表示第 i 堆到第 j 堆合并成一堆的代价最小值
int dp[N][N];

/* 区间DP */
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> s[i];
        // 直接构造前缀和
        s[i] += s[i - 1];
    }

    // 由于区间需要使用所有子区间长度的 dp 值，所以需要从区间长度开始枚举
    for (int len = 2; len <= n; ++len) {
        // 枚举区间起点
        for (int i = 1; i + len - 1 <= n; ++i) {
            int j = i + len - 1;
            // 先初始化为一个极大值
            dp[i][j] = 0x3f3f3f3f;
            // 枚举区间分割线
            for (int k = i; k < j; ++k) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + s[j] - s[i - 1]);
            }
        }
    }

    cout << dp[1][n] << endl;

    return 0;
}